/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package de.cismet.cids.custom.switchon; import org.apache.log4j.Logger; import org.jfree.chart.ChartColor; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.labels.ItemLabelAnchor; import org.jfree.chart.labels.ItemLabelPosition; import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.StackedBarRenderer; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.ui.TextAnchor; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.NumberFormat; import java.util.List; import java.util.Locale; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.LineBorder; /** * DOCUMENT ME! * * @author jlauter * @version $Revision$, $Date$ */ public class RaineventChartPanel extends javax.swing.JPanel { //~ Static fields/initializers --------------------------------------------- private static final Logger LOG = Logger.getLogger(RaineventChartPanel.class); //~ Instance fields -------------------------------------------------------- private final transient Rainevent rainevent; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel pnlChart; // End of variables declaration//GEN-END:variables //~ Constructors ----------------------------------------------------------- /** * Creates new form RaineventChartPanel. * * @param rainevent DOCUMENT ME! */ public RaineventChartPanel(final Rainevent rainevent) { this.rainevent = rainevent; initComponents(); init(); } //~ Methods ---------------------------------------------------------------- /** * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The * content of this method is always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { final java.awt.GridBagConstraints gridBagConstraints; pnlChart = new javax.swing.JPanel(); setOpaque(false); setLayout(new java.awt.GridBagLayout()); pnlChart.setOpaque(false); pnlChart.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; add(pnlChart, gridBagConstraints); } // </editor-fold>//GEN-END:initComponents /** * DOCUMENT ME! */ private void init() { final List<Double> data = rainevent.getPrecipitations(); final Integer interval = rainevent.getInterval(); try { if (pnlChart != null) { pnlChart.removeAll(); final BarChart chart = new BarChart(data, interval); chart.setBorder(new LineBorder(Color.black, 1)); pnlChart.add(chart, BorderLayout.CENTER); } Component parent = RaineventChartPanel.this.getParent(); Component current = RaineventChartPanel.this; while (parent != null) { current = parent; parent = parent.getParent(); } if (current instanceof JFrame) { ((JFrame)current).pack(); } else { current.invalidate(); current.validate(); } } catch (Exception ex) { LOG.error("Cannot create BarChart", ex); } } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ private class BarChart extends JPanel { //~ Constructors ------------------------------------------------------- /** * Creates a new BarChart object. * * @param data DOCUMENT ME! * @param interval DOCUMENT ME! */ public BarChart(final List<Double> data, final int interval) { final DefaultCategoryDataset dataset = createDataset(data, interval); final JFreeChart chart = createChart(dataset); final ChartPanel chartPanel = new ChartPanel(chart, false); this.setLayout(new BorderLayout()); this.add(chartPanel, BorderLayout.CENTER); } //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! * * @param data DOCUMENT ME! * @param interval DOCUMENT ME! * * @return DOCUMENT ME! * * @throws IllegalStateException DOCUMENT ME! */ private DefaultCategoryDataset createDataset(final List<Double> data, final int interval) { final DefaultCategoryDataset dataset = new DefaultCategoryDataset(); // // row keys final List<Double> values = data; int steps = interval; // Zwei Nachkommastellen im englischen Format final NumberFormat nf = new DecimalFormat("#0.00", new DecimalFormatSymbols(Locale.ENGLISH)); for (final Double value : values) { try { final String s = nf.format(value.doubleValue()); final Double valueFormated = new Double(s); dataset.addValue(valueFormated.doubleValue(), "[" + Unit.L_S_HA + "]", String.valueOf(steps)); steps += interval; } catch (NumberFormatException e) { final String message = "Cannot format double value"; throw new IllegalStateException(message, e); } } return dataset; } /** * DOCUMENT ME! * * @param dataset DOCUMENT ME! * * @return DOCUMENT ME! */ private JFreeChart createChart(final DefaultCategoryDataset dataset) { final JFreeChart chart = ChartFactory.createBarChart( null, org.openide.util.NbBundle.getMessage( RaineventChartPanel.class, "RaineventChartPanel.createChart(DefaultCategoryDataset).xAxis"), org.openide.util.NbBundle.getMessage( RaineventChartPanel.class, "RaineventChartPanel.createChart(DefaultCategoryDataset).yAxis"), dataset, PlotOrientation.VERTICAL, false, false, false); // set the background color for the chart... chart.setBackgroundPaint(Color.white); // get a reference to the plot for further customisation... final CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.lightGray); plot.setDomainGridlinePaint(Color.white); plot.setRangeGridlinePaint(Color.white); // set the range axis to display integers only... final NumberAxis rangeAxis = (NumberAxis)plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); rangeAxis.setUpperMargin(0.15); final StackedBarRenderer renderer = new StackedBarRenderer(false); renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition( ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER)); renderer.setSeriesPaint(0, ChartColor.VERY_LIGHT_BLUE); renderer.setShadowVisible(false); chart.getCategoryPlot().setRenderer(renderer); return chart; } } }